type TargetContext = "_self" | "_parent" | "_blank" | "_top";

export const openWindow = (url: string, opts?: { target?: TargetContext; [key: string]: any }) => {
	const { target = "_blank", ...others } = opts || {};
	window.open(
		url,
		target,
		Object.entries(others)
			.reduce((preValue: string[], curValue) => {
				const [key, value] = curValue;
				return [...preValue, `${key}=${value}`];
			}, [])
			.join(",")
	);
};

export const regexUrl = new RegExp(
	"^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$",
	"i"
);

/**
 * @param str 需要转下划线的驼峰字符串
 * @returns 字符串下划线
 */
export const humpToUnderline = (str: string): string => {
	return str.replace(/([A-Z])/g, "-$1").toLowerCase();
};

/**
 * @param str 需要转驼峰的下划线字符串
 * @returns 字符串驼峰
 */
// export const underlineToHump = (str: string): string => {
// 	if (!str) return "";
// 	return str.replace(/\-(\w)/g, (_, letter: string) => {
// 		return letter.toUpperCase();
// 	});
// };

/**
 * 驼峰转横杠
 */
export const humpToDash = (str: string): string => {
	return str.replace(/([A-Z])/g, "-$1").toLowerCase();
};

export const setCssVar = (prop: string, val: any, dom = document.documentElement) => {
	dom.style.setProperty(prop, val);
};

export const getCssVar = (prop: string, dom = document.documentElement) => {
	return getComputedStyle(dom).getPropertyValue(prop);
};

/**
 * 查找数组对象的某个下标
 * @param {Array} ary 查找的数组
 * @param {Functon} fn 判断的方法
 */
// eslint-disable-next-line
export const findIndex = <T = Recordable>(ary: Array<T>, fn: Fn): number => {
	if (ary.findIndex) {
		return ary.findIndex(fn);
	}
	let index = -1;
	ary.some((item: T, i: number, ary: Array<T>) => {
		const ret: T = fn(item, i, ary);
		if (ret) {
			index = i;
			return ret;
		}
	});
	return index;
};

export const trim = (str: string) => {
	return str.replace(/(^\s*)|(\s*$)/g, "");
};

/**
 * @param {Date | number | string} time 需要转换的时间
 * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
 */
export function formatTime(time: Date | number | string, fmt: string) {
	if (!time) return "";
	else {
		const date = new Date(time);
		const o = {
			"M+": date.getMonth() + 1,
			"d+": date.getDate(),
			"H+": date.getHours(),
			"m+": date.getMinutes(),
			"s+": date.getSeconds(),
			"q+": Math.floor((date.getMonth() + 3) / 3),
			S: date.getMilliseconds(),
		};
		if (/(y+)/.test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
		}
		for (const k in o) {
			if (new RegExp("(" + k + ")").test(fmt)) {
				fmt = fmt.replace(
					RegExp.$1,
					RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
				);
			}
		}
		return fmt;
	}
}

/**
 * 生成随机字符串
 */
export function toAnyString() {
	const str: string = "xxxxx-xxxxx-4xxxx-yxxxx-xxxxx".replace(/[xy]/g, (c: string) => {
		const r: number = (Math.random() * 16) | 0;
		const v: number = c === "x" ? r : (r & 0x3) | 0x8;
		return v.toString();
	});
	return str;
}

/**
 * 首字母大写
 */
export function firstUpperCase(str: string) {
	return str.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
}

/**
 * 把对象转为formData
 */
export function objToFormData(obj: Recordable) {
	const formData = new FormData();
	Object.keys(obj).forEach((key) => {
		formData.append(key, obj[key]);
	});
	return formData;
}
// 获取图片地址
export const getImageUrl = (filename: string): string => {
	const imgUrl = new URL(`/src/assets/images/${filename}`, import.meta.url).href;
	return imgUrl;
};

export default null;
